package org.sistema.pgfx.facade;

import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

import pgfx.general.entidades.Persona;
import com.pgfx.ejbModule.facade.impl.BaseFacadeRemoteBean;
import com.pgfx.ejbModule.utils.ConsultarConfig;

/**
 * Session Bean implementation class PersonaClienteFacade
 */
@Stateless
public class PersonaFacade extends BaseFacadeRemoteBean<Persona> implements
		PersonaFacadeRemote {

	/**
	 * Default constructor.
	 */
	public PersonaFacade() {
	}
	@Override
	public Persona buscarPersona(Persona pu) {
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<Persona> c = cb.createQuery(Persona.class);
		Root<Persona> root = c.from(Persona.class);
		c.select(root)
		.where(cb.equal(root.get("codigo"),pu.getCodigo()));
		//el persona obtenido.
		Persona obt;
		try {
			obt = em.createQuery(c).getSingleResult();
		}catch (NoResultException nre) {
			obt=null;
		}catch (NonUniqueResultException nure) {
			obt=null;
		}
		return obt;
	}
	/*
	 * Busca las personas del Sistema que aun no estan catastradas como USUARIOS
	 */
	@Override
	public List<Persona> buscarPersonas() throws NoResultException {
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<Persona> c = cb.createQuery(Persona.class);
		Root<Persona> root = c.from(Persona.class);
		//c.select(root).where(cb.equal(root.get("alias"),pu.getAlias()),cb.equal(root.get("clave"),pu.getClave()));
		c.select(root);
		//el usuario obtenido.
		List<Persona> obt;

		obt = em.createQuery(c).getResultList();
		
		return obt;
	}
	@Override
	protected String getWhereExpresion(ConsultarConfig consultarConfig) {
		return null;
	}
	
	/**
	 * Recupera todas las personas de la tabla personas de la base de datos
	 * Exceptuando aquellas personas pasadas en la clausula SqlInToExclude 
	 */
	public List<Persona> buscarPersonas(String sqlInToExclude) throws NoResultException {
		if (sqlInToExclude != null && !sqlInToExclude.equals(""))
			sqlInToExclude = "WHERE o.codigo NOT IN " + sqlInToExclude;
		else
			sqlInToExclude = "";
		
		String sql = "SELECT o FROM Persona AS o " + sqlInToExclude + " ORDER BY nombre";

		Query q = em.createQuery(sql, Persona.class);
		List<Persona> lista =  (ArrayList<Persona>) q.getResultList();
		return lista;
	}
}
